English Русский 中文 Español Deutsch Português
クロスプラットフォームEA: ストップ

クロスプラットフォームEA: ストップ

MetaTrader 5 | 13 10月 2017, 13:23
913 0
Enrico Lambino
Enrico Lambino

コンテンツ表

  1. イントロダクション
  2. COrder
  3. CStop
  4. CStops
  5. COrderStop
  6. COrderStops
  7. ストップのチャート表現
  8. オーダーストップチェック
  9. サンプル
  10. 結論
  11. この記事で使用されるプログラム
  12. この記事で紹介されているクラスファイル


イントロダクション

以前の記事で説明したように、クロスプラットフォームのEA に関するオーダーマネージャ (COrderManager) を作成しています。 どちらのバージョンでも、EAはCOrderのインスタンスを作成することによって、トレード情報をメモリに保存します。 このクラスオブジェクトのインスタンスへの動的ポインターのコンテナは、COrderManager のクラスメンバーとしても使用できます (現在および過去のトレードの両方)。

オーダーマネージャーは、各トレードのストップを直接処理することができます。 ただし、一定の制限があります。

  • COrderManager は、ほとんどの場合、各トレードのストップをどのように処理するかをカスタマイズするために拡張する必要があります。
  • COrderManager の既存のメソッドは主要なトレードの記入項目にだけ対処します。

COrderManager は、各トレードのストップを独自に処理できるように拡張することができます。 しかし、実際のレベルの配置に限られていないだけでなく、ストップの監視に関連する他のタスクにも、変更やチェックなどがあります。 この関数は、分割実装に対応していない現在の COrderManager をはるかに複雑にします。

オーダーマネージャは、主なトレードのエントリを扱い, 保留中のオーダーの配置など、他のトレード操作を実行する必要があります。 オーダーマネージャが独自に処理することは可能ですが、メインのトレードのエントリにフォーカスし、別のクラスオブジェクトがストップを処理できるようにすることをお勧めします。

この記事では、COrderManager がトレードのエントリと決済を処理する実装について説明し (現在のところ)、別のクラスオブジェクト (CStop) によって個別に処理されるストップの実装をします。

COrder

以前の記事 (「クロスプラットフォームEA: オーダー」を参照) から学んだように、COrderのインスタンスは、トレードの成功 (エントリ) の後に作成されます。 MetaTrader4とMetaTrader5については、ストップロス とテイクプロフィットに関する情報は、ブローカーから保存することができます。 ただし、ストップがブローカーから非表示になっている場合、または複数のストップが関係している場合は、ストップのほとんどに関する情報をローカルに保存する必要があります。 したがって、後者の場合には、ポジションのエントリが成功した後で、COrderインスタンスを最初に作成し、その後にその ストップロス とテイクレベルを表すオブジェクトインスタンスを指定する必要があります。 以前の記事では、次の図に示すように、COrderインスタンス作成時にオーダーマネージャに追加するメソッドを示しました。


TradeOpen

このストップは、同じメソッドで追加されます。 これを行うには、新しいCOrderインスタンスが作成された後、現在進行中のトレード (COrders) のリストに追加される前に、メソッドを挿入するだけで済みます。 したがって、次の図に示すように、上記の図をわずかに変更する必要があります。


TradeOpen-オーダーストップ

ストップの作成の一般的な操作を次の図に示します。

ストップの作成の一般的な操作

前述の2つのフローチャートに示されているように、トレードが正常にエントリーされるとすぐに、新しいCOrderインスタンスが作成されます。 その後、定義された ストップロス およびテイクレベルに対して COrderStop のインスタンスが作成されます。 EAの初期化で宣言された CStop インスタンスがない場合、この特定のプロセスはスキップされます。 一方、COrderStop のインスタンスが作成された場合、インスタンスへのポインタは、先ほど作成したCOrderインスタンスの下に格納されます。 COrderの Init メソッド内でこの操作を行います:

bool COrderBase::Init(COrders *orders,CStops *stops)
  {
   if(CheckPointer(orders))
      SetContainer(GetPointer(orders));
   if(CheckPointer(stops))
      CreateStops(GetPointer(stops));
   m_order_stops.SetContainer(GetPointer(this));
   return true;
  }

COrderのインスタンスのストップを作成するには、以下に示す CreateStops メソッドを呼び出していることがわかります。

void COrderBase::CreateStops(CStops *stops)
  {
   if(!CheckPointer(stops))
      return;
   if(stops.Total()>0)
     {
      for(int i=0;i<stops.Total();i++)
        {
         CStop *stop=stops.At(i);
         if(CheckPointer(stop)==POINTER_INVALID)
            continue;
         m_order_stops.NewOrderStop(GetPointer(this),stop);
        }
     }
  }
このメソッドは、ストップロス とテイクレベルの各ペアを表す CStop の使用可能なすべてのインスタンスを繰り返し処理します。 各 CStop インスタンスは、特定の順序のすべてのストップのコンテナである COrderStops のインスタンスに渡されます。 次に、クラスオブジェクトの ヒエラルキー を次のように構築します。


ストップの階層

COrderの各インスタンスには、COrderStops 型のメンバが1つあります。 この COrderStops インスタンスは、COrderStop のインスタンスへのポインタを含むコンテナ (CArrayObj の拡張) です。 各 COrderStop インスタンスは、特定のトレードのみ (COrderインスタンス) のストップ (CStop) を表します。

CStop

先に説明したように、オーダーマネージャのソースコードを変更することなく、各トレードのストップをどのように処理するかをカスタマイズするという一定の自由度を持たせたいと考えています。 主にクラス CStop によって達成されます。 このクラスの担当には、次のものがあります。

  1. ストップロス およびテイクレベルの定義
  2. ストップの計算に必要な計算を実行する
  3. 主要トレードの ストップロス およびテイクレベルの導入
  4. ストップがトリガされているかどうかを確認する
  5. ストップロス およびテイクレベルの実装における MQL4 と MQL5 の違いを調整する
  6. 時間の経過によるストップの処理メソッドを定義します (例: ブレイクイーブン、トレーリングなど)。

#1 #5 については、この記事で説明しますが、#6 は別の記事で説明します。

Types

この記事では、次の3種類のストップについて説明します。

  1. ブローカーベースのストップ-トレードリクエストと一緒にブローカーに送信されるストップ
  2. 保留中のオーダーのストップ-メインのポジション (MetaTrader4、MetaTrader5ヘッジモード) に対して部分的または完全なヘッジとして機能するか、メインのポジション (MetaTrader5網モード) から減算する保留中のオーダーを使用してストップします。
  3. 仮想ストップ (ステルスストップ)-ブローカーから非表示にし、EAによってローカルで管理されます。

MetaTrader4 では、ブローカーベースのストップは、トレーダーが最も精通している ストップロス とテイクプロフィットです。 主要なトレードと共にブローカーに送られる価格またはストップです。 ヘッジモードのMetaTrader5バージョンは、メタトレーダーと同じメカニックを使用しています。 一方、ネットモードでは、ストップロス とテイクプロフィットが異なるため (シンボルまたはツールのポジション全体に適用)、このタイプの CStop には保留中のオーダーストップが使用されます。

保留中のオーダーストップは、保留中のオーダーを使用して、ブローカーベースのストップを模倣します。 保留中のオーダーが実行されるとすぐに、EA は、トリガされた保留中のオーダーのボリュームを使用してメインのポジションを閉じるためにトレード操作 (OrderCloseBy) を実行します。 MetaTrader4と MetaTrader5、ヘッジモード、バージョンに当てはまります。 MetaTrader5、ネットモードのバージョンでは、メインのポジションの決済は、1つのシンボルごとに任意の時点で維持することができますので、自動的に行われます。

メインストップ

メインストップは、ポジション全体の決済をトリガします。 通常、ブローカーベースのストップです。 いずれかのブローカーベースの ストップロス またはテイクプロフィットがトリガされると、全体のポジションは市場を離れます。 しかし、複数のストップがあり、ブローカーベースのストップがない場合は、EA は、主なストップを決定させます。 この場合、COrderはトレードの主要なストップである CStop のインスタンスを選択しなければならない。 特に資金の管理などのポジションの主なストップに依存する関数や機能に便利です。 メインストップの ストップロス は、全体のポジションの決済につながるので、トレードをエントリーするための最大のリスクを表します。 そして、メインのストップインスタンスで、EA は応じてサイズを計算することができるでしょう。

ストップが主要なストップとして割り当てられるとき、ボリュームは主要なトレードの最初のボリュームと常に等しいことになります。 ブローカーベースの仮想ストップでも動作しますが、保留中のオーダーに基づくストップでは使用できません。 このアプローチにつながる2つの関連する問題があります。

最初の理由は、MetaTrader4では、保留中のオーダーのエントリの価格を変更することができますが、未決のオーダーはまだトリガされていません。 MetaTrader5 では、トレードオペレーションの明確なフットプリントが維持されなければならないため、不可能です。 新しい保留中のオーダーを発行する必要があり、成功した場合は古いものを削除してから、EAは新しい保留中のオーダーを新しいストップとして使用する必要があります。

2番目の問題は、保留中のオーダーがブローカーに送信されている間に、古い保留中のオーダーがトリガされる可能性があることです。 このEAは、保留中のオーダー (ブローカーが持っている) のトリガに制御を持っていないので、想定されているよりも、主なトレードからより多くのボリュームを閉じる問題につながることができます。

この問題を回避するためのよりシンプルなアプローチでは、保留中のオーダーのボリュームを主要トレードの有効期間中に動的に調整するのではなく、トレードの作成時に保留中のオーダーのボリュームを割り当てることになります。 ただし、メインのストップが保留中のオーダーの種類である場合は、他の保留中のオーダーをストップする必要があります。

Volume

メインのストップでは、メインのポジションから差し引くようにサイズを割り当てる必要はなく、トリガされるとすぐに、ポジション全体を閉じる必要があります。 ただし、他の種類のストップでは、通常、主ポジションの部分的な決済のみを目的としているため、ボリュームを考慮する必要があります。 この配分は4つのタイプに分けられます:

  1. 固定–固定ロット
  2. 残存率-メイントレードの残存サイズの割合
  3. 合計パーセント-主要トレードの総サイズ (初期量) の割合
  4. 残っている-主要なトレードの残りのボリューム。

固定ロットは、ボリューム割り当ての最もシンプルな形式です。 しかし、EAが各ポジションの動的サイズ計算を使用している場合、最適に機能しません。 サイズがEAに固定されている場合にのみ最適です。

残りのパーセントと残りの割合は、メイン・ストップが仮想であるときに最もよく使われます。 残りは、主要トレードの残りのボリュームよりも大きいボリュームに対してクローズ操作を実行したりすることを防ぎます。 残りの割合は、一方で、EAは、最初のボリュームに基づいていないトレードを閉じる必要がありますが、メインのトレードに残って使用されます。

合計の割合は、ブローカーベース、仮想、および保留中のオーダーベースのストップで使用できます。 このメソッドを使用した計算は、初期の主要トレード量に基づいています。

One-Cancels-the-Other (OCO)

CStop は、常に ストップロス またはテイクプロフィットのいずれかを表す値を持つぺアによって表されます。 ただし、いずれかの値にゼロを割り当てることによって、片側のレベル (テイクプロフィットと欠落した ストップロス、またはその逆) が可能です。 デフォルトでは、1つのストップがトリガされると、他方が決済します。 唯一の例外は、CStop インスタンスがメインストップである場合です。

Base Class

基本クラス

class CStopBase : public CObject
  {
protected:
   //---ストップ順序の変数   
   bool              m_active;
   bool              m_main;
   string            m_name;
   bool              m_oco;
   double            m_stoploss;
   string            m_stoploss_name;
   ENUM_STOP_TYPE    m_stop_type;
   double            m_takeprofit;
   string            m_takeprofit_name;
   int               m_delay;
   //---ストップ順序トレード変数
   ENUM_VOLUME_TYPE  m_volume_type;
   double            m_volume;
   int               m_magic;
   int               m_deviation;
   string            m_comment;
   //--- stop order objects parameters
   bool              m_entry_visible;
   bool              m_stoploss_visible;
   bool              m_takeprofit_visible;
   color             m_entry_color;
   color             m_stoploss_color;
   color             m_takeprofit_color;
   ENUM_LINE_STYLE   m_entry_style;
   ENUM_LINE_STYLE   m_stoploss_style;
   ENUM_LINE_STYLE   m_takeprofit_style;
   //---オブジェクト
   CSymbolManager   *m_symbol_man;
   CSymbolInfo      *m_symbol;
   CAccountInfo     *m_account;
   CTradeManager     m_trade_man;
   CExpertTradeX    *m_trade;
   CTrails          *m_trails;
   CEventAggregator *m_event_man;
   CStops           *m_stops;
public:
                     CStopBase(void);
                    ~CStopBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_STOP;}
   //---初期化
   virtual bool      Init(CSymbolManager*,CAccountInfo*,CEventAggregator*);
   virtual bool      InitAccount(CAccountInfo*);
   virtual bool      InitEvent(CEventAggregator*);
   virtual bool      InitSymbol(CSymbolManager*);
   virtual bool      InitTrade(void);
   virtual CStops   *GetContainer(void);
   virtual void      SetContainer(CStops*);
   virtual bool      Validate(void) const;
   //---ゲッターとセッター
   bool              Active(void);
   void              Active(const bool);
   bool              Broker(void) const;
   void              Comment(const string);
   string            Comment(void) const;
   void              Delay(int delay);
   int               Delay(void) const;
   void              SetDeviation(const int);
   int               SetDeviation(void) const;
   void              EntryColor(const color clr);
   void              EntryStyle(const ENUM_LINE_STYLE);
   void              EntryVisible(const bool);
   bool              EntryVisible(void) const;
   void              Magic(const int);
   int               Magic(void) const;
   void              Main(const bool);
   bool              Main(void) const;
   void              Name(const string);
   string            Name(void) const;
   void              OCO(const bool oco);
   bool              OCO(void) const;
   bool              Pending(void) const;
   void              StopLoss(const double);
   double            StopLoss(void) const;
   void              StopLossColor(const color);
   bool              StopLossCustom(void);
   void              StopLossName(const string);
   string            StopLossName(void) const;
   void              StopLossVisible(const bool);
   bool              StopLossVisible(void) const;
   void              StopLossStyle(const ENUM_LINE_STYLE);
   void              StopType(const ENUM_STOP_TYPE);
   ENUM_STOP_TYPE    StopType(void) const;
   string            SymbolName(void);
   void              TakeProfit(const double);
   double            TakeProfit(void) const;
   void              TakeProfitColor(const color);
   bool              TakeProfitCustom(void);
   void              TakeProfitName(const string);
   string            TakeProfitName(void) const;
   void              TakeProfitStyle(const ENUM_LINE_STYLE);
   void              TakeProfitVisible(const bool);
   bool              TakeProfitVisible(void) const;
   bool              Virtual(void) const;
   void              Volume(double);
   double            Volume(void) const;
   void              VolumeType(const ENUM_VOLUME_TYPE);
   ENUM_VOLUME_TYPE  VolumeType(void) const;
   //---ストップ順序の点検
   virtual bool      CheckStopLoss(COrder*,COrderStop*);
   virtual bool      CheckTakeProfit(COrder*,COrderStop*);
   virtual bool      CheckStopOrder(ENUM_STOP_MODE,COrder*,COrderStop*)=0;
   virtual bool      DeleteStopOrder(const ulong)=0;
   virtual bool      DeleteMarketStop(const ulong)=0;
   virtual bool      OrderModify(const ulong,const double);
   //---ストップオーダーオブジェクトの作成
   virtual CStopLine *CreateEntryObject(const long,const string,const int,const double);
   virtual CStopLine *CreateStopLossObject(const long,const string,const int,const double);
   virtual CStopLine *CreateTakeProfitObject(const long,const string,const int,const double);
   //---ストップオーダー価格計算   
   virtual bool      Refresh(const string);
   virtual double    StopLossCalculate(const string,const ENUM_ORDER_TYPE,const double);
   virtual double    StopLossCustom(const string,const ENUM_ORDER_TYPE,const double);
   virtual double    StopLossPrice(COrder*,COrderStop*);
   virtual double    StopLossTicks(const ENUM_ORDER_TYPE,const double);
   virtual double    TakeProfitCalculate(const string,const ENUM_ORDER_TYPE,const double);
   virtual double    TakeProfitCustom(const string,const ENUM_ORDER_TYPE,const double);
   virtual double    TakeProfitPrice(COrder*,COrderStop*);
   virtual double    TakeProfitTicks(const ENUM_ORDER_TYPE,const double);
   //---トレーリング   
   virtual bool      Add(CTrails*);
   virtual double    CheckTrailing(const string,const ENUM_ORDER_TYPE,const double,const double,const ENUM_TRAIL_TARGET);
protected:
   //---オブジェクトの作成
   virtual CStopLine *CreateObject(const long,const string,const int,const double);
   //---ストップオーダー価格計算
   virtual double    LotSizeCalculate(COrder*,COrderStop*);
   //---ストップ順序の記入項目   
   virtual bool      GetClosePrice(const string,const ENUM_ORDER_TYPE,double&);
   //---ストップ順序の決済
   virtual bool      CloseStop(COrder*,COrderStop*,const double)=0;
   //---初期化
   virtual void      Deinit(void);
   virtual void      DeinitSymbol(void);
   virtual void      DeinitTrade(void);
   virtual void      DeinitTrails(void);
  };

ピップまたはポイント数に基づいた ストップロス およびテイクプロフィットレベルの場合、少なくとも4つのクラスメソッドを記憶する必要があります。

  1. メソッド StopType を使用して、ストップの種類 (ブローカーベース、保留中の順序、または仮想)
  2. VolumeType メソッドを使用して使用されるボリューム計算の種類
  3. ストップロス メソッドを使用して、ポイントの ストップロス レベル (必要な場合はいつでも)
  4. テイクプロフィットメソッドを使用して、ポイントのテイクプロフィットレベル (必要な場合)

すべては、クラスのメンバーの単なるセッターなので、メソッドで詳しく説明する必要はありません。 メソッドの残りの部分のほとんどは、内部計算でクラスによってのみ必要です。 保護されたメソッドの中で最も重要なのは、以下のコードを示す StopLossCalculate および TakeProfitCalculate メソッドです。

double CStopBase::StopLossCalculate(const string symbol,const ENUM_ORDER_TYPE type,const double price)
  {   
   if(!Refresh(symbol))
      return 0;
   if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_LIMIT)
      return price-m_stoploss*m_symbol.Point();
   else if(type==ORDER_TYPE_SELL || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_LIMIT)
      return price+m_stoploss*m_symbol.Point();
   return 0;
  }

double CStopBase::TakeProfitCalculate(const string symbol,const ENUM_ORDER_TYPE type,const double price)
  {
   if(!Refresh(symbol))
      return 0;
   if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_BUY_STOP || type==ORDER_TYPE_BUY_LIMIT)
      return price+m_takeprofit*m_symbol.Point();
   else if(type==ORDER_TYPE_SELL || type==ORDER_TYPE_SELL_STOP || type==ORDER_TYPE_SELL_LIMIT)
      return price-m_takeprofit*m_symbol.Point();
   return 0;
  }

どちらのメソッドでも、主なトレードに関連する3つの引数を取ります。 このメソッドは、最初に Refresh メソッドを使用してシンボルを更新することによって開始され、シンボルマネージャが正しいシンボルを使って修正します。 シンボルが更新されると、初期化時にクラスインスタンスに渡されたポイント値に基づいて、ストップロス またはテイクプロフィットの値が返されます。

CStops

クラス CStops は、CStop のインスタンスのコンテナとして機能します。 このクラスのインスタンスは、メンバの1つとしてオーダーマネージャに動的に追加する必要があります。次のコードは、CStops の基本クラスである CStopsBase を示しています。

class CStopsBase : public CArrayObj
  {
protected:
   bool              m_active;
   CEventAggregator *m_event_man;
   CObject          *m_container;
public:
                     CStopsBase(void);
                    ~CStopsBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_STOPS;}
   //---初期化
   virtual bool      Init(CSymbolManager*,CAccountInfo*,CEventAggregator*);
   virtual CObject  *GetContainer(void);
   virtual void      SetContainer(CObject*);
   virtual bool      Validate(void) const;
   //---セッターとゲッター
   virtual bool      Active(void) const;
   virtual void      Active(const bool);
   virtual CStop    *Main(void);
   //---回復
   virtual bool      CreateElement(const int);
  };

このクラスは、この記事シリーズまでに説明した他のコンテナと非常によく似ています。

COrderStop

COrderStop は、特定のトレードの CStop の実装を表します。 特定のポジションでは、CStop は最大1つの COrderStop を作成できます。 ただし、任意の数の COrderStop インスタンスは、CStop の同じインスタンスを共有できます。 したがって、EAに CStop の3つの異なるインスタンスがある場合、通常、各COrderインスタンスには COrderStop のインスタンス数が同じになることが予想されます。 EAが1000トレードを行った場合、作成された COrderStop インスタンスの数は 1000 * 3 = 3000 になりますが、作成される CStop インスタンスの数は依然として3になります。

COrderStop の基になっている COrderStopBase の定義は、以下のコードに示されています。

class COrderStopBase : public CObject
  {
protected:
   bool              m_active;
   //---ストップパラメータ
   double            m_volume;
   CArrayDouble      m_stoploss;
   CArrayDouble      m_takeprofit;
   ulong             m_stoploss_ticket;
   ulong             m_takeprofit_ticket;
   bool              m_stoploss_closed;
   bool              m_takeprofit_closed;
   bool              m_closed;
   ENUM_STOP_TYPE    m_stop_type;
   string            m_stop_name;
   //--- main order object
   COrder           *m_order;
   //--- stop objects
   CStop            *m_stop;
   CStopLine        *m_objentry;
   CStopLine        *m_objsl;
   CStopLine        *m_objtp;
   COrderStops      *m_order_stops;
public:
                     COrderStopBase(void);
                    ~COrderStopBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_ORDERSTOP;}
   //---初期化
   virtual void      Init(COrder*,CStop*,COrderStops*);
   virtual COrderStops *GetContainer(void);
   virtual void      SetContainer(COrderStops*);
   virtual void      Show(bool);
   //---ゲッターとセッター  
   bool              Active(void) const;
   void              Active(bool active);
   string            EntryName(void) const;
   ulong             MainMagic(void) const;
   ulong             MainTicket(void) const;
   double            MainTicketPrice(void) const;
   ENUM_ORDER_TYPE   MainTicketType(void) const;
   COrder           *Order(void);
   void              Order(COrder*);
   CStop            *Stop(void);
   void              Stop(CStop*);
   bool              StopLoss(const double);
   double            StopLoss(void) const;
   double            StopLoss(const int);
   void              StopLossClosed(const bool);
   bool              StopLossClosed(void);
   double            StopLossLast(void) const;
   string            StopLossName(void) const;
   void              StopLossTicket(const ulong);
   ulong             StopLossTicket(void) const;
   void              StopName(const string);
   string            StopName(void) const;
   bool              TakeProfit(const double);
   double            TakeProfit(void) const;
   double            TakeProfit(const int);
   void              TakeProfitClosed(const bool);
   bool              TakeProfitClosed(void);
   double            TakeProfitLast(void) const;
   string            TakeProfitName(void) const;
   void              TakeProfitTicket(const ulong);
   ulong             TakeProfitTicket(void) const;
   void              Volume(const double);
   double            Volume(void) const;
   //---チェック   
   virtual void      Check(double&)=0;
   virtual bool      Close(void);
   virtual bool      CheckTrailing(void);
   virtual bool      DeleteChartObject(const string);
   virtual bool      DeleteEntry(void);
   virtual bool      DeleteStopLines(void);
   virtual bool      DeleteStopLoss(void);
   virtual bool      DeleteTakeProfit(void);
   virtual bool      IsClosed(void);
   virtual bool      Update(void) {return true;}
   virtual void      UpdateVolume(double) {}
   //---初期化 
   virtual void      Deinit(void);
   //---回復
   virtual bool      Save(const int);
   virtual bool      Load(const int);
   virtual void      Recreate(void);
protected:
   virtual bool      IsStopLossValid(const double) const;
   virtual bool      IsTakeProfitValid(const double) const;
   virtual bool      Modify(const double,const double);
   virtual bool      ModifyStops(const double,const double);
   virtual bool      ModifyStopLoss(const double) {return true;}
   virtual bool      ModifyTakeProfit(const double){return true;}
   virtual bool      UpdateOrderStop(const double,const double){return true;}
   virtual bool      MoveStopLoss(const double);
   virtual bool      MoveTakeProfit(const double);
  };

COrderStop は順番に COrderStops (次のセクションで議論される) によって含まれています。 EA の実際の開発では、COrderStop のインスタンスを宣言する必要はありません。 CStop の特定のインスタンスに基づいてCOrderによって自動的に作成されます。

COrderStops

class COrderStopsBase : public CArrayObj
  {
protected:
   bool              m_active;
   CArrayInt         m_types;
   COrder           *m_order;
public:
                     COrderStopsBase(void);
                    ~COrderStopsBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_ORDERSTOPS;}
   void              Active(bool);
   bool              Active(void) const;
   //---初期化
   virtual CObject *GetContainer(void);
   virtual void      SetContainer(COrder*);
   virtual bool      NewOrderStop(COrder*,CStop*)=0;
   //---チェック
   virtual void      Check(double &volume);
   virtual bool      CheckNewTicket(COrderStop*);
   virtual bool      Close(void);
   virtual void      UpdateVolume(const double) {}
   //---ストップ線の隠蔽と表示
   virtual void      Show(const bool);
   //---回復
   virtual bool      CreateElement(const int);
   virtual bool      Save(const int);
   virtual bool      Load(const int);
  };


これはちょうど CStop のようにちょうど典型的なコンテナのように見えます。 ただし、このメソッドには、ポインタを格納するオブジェクト (COrderStop) のメソッドをミラーリングするメソッドがあります。

ストップのチャート表現

CStopLine は CStop のクラスメンバであり、その主な役割はチャート上のストップをグラフィカルに表現したものです。 EAには3つのコア関数があります。

  1. COrderインスタンスの初期化時にストップを表示する
  2. ストップの1つまたは両方が変更された場合のストップを更新する
  3. 主要なトレードが相場を去ったと同時にストップラインを取除きます。

この関数はすべて、CStop クラスを通じて実装されます。

CStopLine の基準となる CStopLineBase の定義を以下に示します。

class CStopLineBase : public CChartObjectHLine
  {
protected:
   bool              m_active;
   CStop            *m_stop;
public:
                     CStopLineBase(void);
                    ~CStopLineBase(void);
   virtual int       Type(void) const {return CLASS_TYPE_STOPLINE;}
   virtual void      SetContainer(CStop*);
   virtual CStop    *GetContainer(void);
   bool              Active(void) const;
   void              Active(const bool);
   virtual bool      ChartObjectExists(void) const;
   virtual double    GetPrice(const int);
   virtual bool      Move(const double);
   virtual bool      SetStyle(const ENUM_LINE_STYLE);
   virtual bool      SetColor(const color);
  };

MetaTrader4の古いバージョンでは、ストップロス およびテイクプロフィットレベルはドラッグによって変更できません。 これらのレベルは、オーダーウィンドウまたはEAとスクリプトを使用して変更する必要がありました。 ただし、レベルのグラフィカルな表現を表示する場合は、特に仮想ストップを扱う場合は、有用かもしれません。

オーダーストップチェック

ストップが所定のポジションに正常に作成された後、次のステップは、相場が特定のストップにヒットしたかどうかを確認することです。 ブローカーベースのストップでは、サーバー側で決済操作が行われるため、このプロセスは必要ありません。 ただし、保留中のオーダーに基づいて仮想ストップを行う場合、ほとんどの場合、決済操作を実行するにはEA自体になります。

仮想ストップについては、EAは、相場の動きを監視し、相場が特定のストップにヒットしたかどうかを確認するための責任があります。 次の図は、一般的な操作を示しています。 相場がストップに達するとすぐに、EAは適切な決算処理を実行します。

OrderStop チェック (仮想)

保留中のオーダーに基づくストップの場合、プロセスは若干複雑になります。 ストップがトリガされると、保留中のオーダーにつながります。 これは、ブローカー側で自動的に行われます。 したがって、特定の保留中のオーダーがまだ保留中であるか、または既に相場に入っているかを検出するのは、EAの責任となります。 保留中のオーダーが既にトリガされている場合は、EAは、直前に実行された保留中のオーダーのボリュームを使用してメインのポジションを閉じます。

COrderStop チェック (保留中のオーダーのストップ)

いずれの場合も、指定されたオーダーストップがトリガーされるとすぐに、ストップは [決済] としてマークが付けられます。 指定されたストップが複数回実行されないようにするためです。

サンプル

例 #1: 平均足と移動平均を使用した EA で、単一のストップ (メインストップ)

ほとんどのEAでは、1つの ストップロス および1つのテイクプロフィットで十分です。 前の記事の例を拡張します (「クロスプラットフォームEA: タイムフィルタ」を参照)、ストップロス とテイクプロフィットをソースコードに追加します。 これを行うには、まず、コンテナ (CStops) の新しいインスタンスを作成します。 次に、CStop のインスタンスを作成し、そのコンテナへのポインターを追加します。 コンテナへのポインターは、最終的にオーダーマネージャーに追加されます。 このコードは次のとおりです。

int()
  {
//---その他のコード

   CStops *stops=new CStops();

   CStop *main=new CStop("main");
   main.StopType(stop_type_main);
   main.VolumeType(VOLUME_TYPE_PERCENT_TOTAL);
   main.Main(true);
   main.StopLoss(stop_loss);
   main.TakeProfit(take_profit);
   stops.Add(GetPointer(main));
   
   order_manager.AddStops(GetPointer(stops));     
//---その他のコード
  }

MetaTrader4 のブローカーベースのストップをテストすると、次の表の結果が表示されます。 トレーダーは、通常のトレードのプラットフォーム上でEAによって実行されると予想されます。

# Time Type Order Size Price S / L T / P Profit Balance
1 2017.01.03 10:00 sell 1 0.30 1.04597 1.05097 1.04097
2 2017.01.03 10:00 t/p 1 0.30 1.04097 1.05097 1.04097 150.00 3150.00
3 2017.01.05 11:00 sell 2 0.30 1.05149 1.05649 1.04649
4 2017.01.05 17:28 s/l 2 0.30 1.05649 1.05649 1.04649 -150.00 3000.00

保留中のオーダーに基づくストップの場合、ストップは標準の sl/tp と同じように事前に配置されますが、保留中のオーダーの形式です。 保留中のオーダーがトリガされるとすぐに、EAは操作を実行し、トリガされた保留中のオーダーのボリュームによって主要トレードを決済します。 ただし、標準の sl/tp とは異なり、EAはクライアント側で実行します。 トレーディングプラットフォームがライブで、EA がチャート上で実行されていない限り、実行されません。

# Time Type Order Size Price S / L T / P Profit Balance
1 2017.01.03 10:00 sell 1 0.30 1.04597 0.00000 0.00000
2 2017.01.03 10:00 buy stop 2 0.30 1.05097 0.00000 0.00000
3 2017.01.03 10:00 buy limit 3 0.30 1.04097 0.00000 0.00000
4 2017.01.03 10:00 buy 3 0.30 1.04097 0.00000 0.00000
5 2017.01.03 10:00 close by 1 0.30 1.04097 0.00000 0.00000 150.00 3150.00
6 2017.01.03 10:00 close by 3 0.00 1.04097 0.00000 0.00000 0.00 3150.00
7 2017.01.03 10:00 delete 2 0.30 1.05097 0.00000 0.00000
8 2017.01.05 11:00 sell 4 0.30 1.05149 0.00000 0.00000
9 2017.01.05 11:00 buy stop 5 0.30 1.05649 0.00000 0.00000
10 2017.01.05 11:00 buy limit 6 0.30 1.04649 0.00000 0.00000
11 2017.01.05 17:28 buy 5 0.30 1.05649 0.00000 0.00000
12 2017.01.05 17:28 close by 4 0.30 1.05649 0.00000 0.00000 -150.00 3000.00
13 2017.01.05 17:28 close by 5 0.00 1.05649 0.00000 0.00000 0.00 3000.00
14 2017.01.05 17:28 delete 6 0.30 1.04649 0.00000 0.00000


仮想ストップは、主要トレードのストップについては何も送信されません。 ブローカーは、EA が決済命令を実行するとすぐに通知されます。 次の表は、仮想ストップを使用した EA の動作を示しています。 ここでは、ストップの目標価格がトリガされるとすぐに、EA は主要トレードをクローズするために、トレードリクエストをサーバに送信します。

# Time Type Order Size Price S / L T / P Profit Balance
1 2017.01.03 10:00 sell 1 0.30 1.04597 0.00000 0.00000
2 2017.01.03 10:00 close 1 0.30 1.04097 0.00000 0.00000 150.00 3150.00
3 2017.01.05 11:00 sell 2 0.30 1.05149 0.00000 0.00000
4 2017.01.05 17:28 close 2 0.30 1.05649 0.00000 0.00000 -150.00 3000.00


さて、 MetaTrader5 に移りましょう。 MetaTrader5 のヘッジモードは、MetaTrader4の最終結果に近いものです。 次の表は、ブローカーベースのストップを使用したテストの結果を示しています。 ここでは、明らかにそれぞれの列に主なトレードの ストップロス とテイクプロフィットのレベルを見ることができます。













Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597 1.05097 1.04097 2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.30/0.30 1.04097

2017.01.03 11:34:38 filled TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell 0.30/0.30 1.05149 1.05649 1.04649 2017.01.05 11:00:00 filled
2017.01.05 17:28:37 5 EURUSD buy 0.30/0.30 1.05649

2017.01.05 17:28:37 filled sl 1.05649

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 3 0.00 0.00 150.00 3150.00 TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell in 0.30 1.05149 4 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 5 EURUSD buy out 0.30 1.05649 5 0.00 0.00 -150.00 3000.00 sl 1.05649

0.00 0.00 0.00 3000.00

ヘッジモードでは、保留中のオーダーは、基本的にMetaTrader4と同じメソッドで動作するので、EA はまた、保留中のオーダーがトリガされたときに操作を実行します。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.30/0.00 1.05097

2017.01.03 11:34:38 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.03 11:34:38 5 EURUSD close by 0.30/0.30 1.04097

2017.01.03 11:34:38 filled close #2 by #4
2017.01.05 11:00:00 6 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 11:00:00 7 EURUSD buy stop 0.30/0.30 1.05649

2017.01.05 17:28:37 filled
2017.01.05 11:00:00 8 EURUSD buy limit 0.30/0.00 1.04649

2017.01.05 17:28:37 canceled
2017.01.05 17:28:37 9 EURUSD close by 0.30/0.30 1.05649

2017.01.05 17:28:37 filled close #6 by #7

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy in 0.30 1.04097 4 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 4 EURUSD buy out by 0.30 1.04097 5 0.00 0.00 150.00 3150.00 close #2 by #4
2017.01.03 11:34:38 5 EURUSD sell out by 0.30 1.04597 5 0.00 0.00 0.00 3150.00 close #2 by #4
2017.01.05 11:00:00 6 EURUSD sell in 0.30 1.05149 6 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 7 EURUSD buy in 0.30 1.05649 7 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 9 EURUSD sell out by 0.30 1.05149 9 0.00 0.00 0.00 3150.00 close #6 by #7
2017.01.05 17:28:37 8 EURUSD buy out by 0.30 1.05649 9 0.00 0.00 -150.00 3000.00 close #6 by #7

0.00 0.00 0.00 3000.00

仮想ストップを使用して、通常、MetaTrader4で見るメソッドを "閉じる" タグを参照してください。 決済操作は主要なトレードの反対のタイプを使用しますが、取引履歴で見ることができます。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.05 11:00:00 4 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 17:28:37 5 EURUSD buy 0.30/0.30 1.05649

2017.01.05 17:28:37 filled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 3 0.00 0.00 150.00 3150.00
2017.01.05 11:00:00 4 EURUSD sell in 0.30 1.05149 4 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 5 EURUSD buy out 0.30 1.05649 5 0.00 0.00 -150.00 3000.00

0.00 0.00 0.00 3000.00

ネットモードで、MetaTrader5は、グローバル ストップロス とテイクプロフィット (全体のポジションに適用される) を使用しているので、EA は異なる ストップロス とテイクプロフィットのレベルを持っているために保留中のオーダーを使用する必要があります。 前に説明したように、ヘッジモードでは、次の表に示すように、ブローカーベースのストップは保留中のオーダーに基づいてストップとして動作します。













Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.30/0.00 1.05097

2017.01.03 11:34:38 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.05 11:00:00 5 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 11:00:00 6 EURUSD buy stop 0.30/0.30 1.05649

2017.01.05 17:28:37 filled
2017.01.05 11:00:00 7 EURUSD buy limit 0.30/0.00 1.04649

2017.01.05 17:28:37 canceled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 4 0.00 0.00 150.00 3150.00
2017.01.05 11:00:00 4 EURUSD sell in 0.30 1.05149 5 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 5 EURUSD buy out 0.30 1.05649 6 0.00 0.00 -150.00 3000.00

0.00 0.00 0.00 3000.00

次の表は、保留中のオーダーに基づいてストップした場合の結果を示しています。 前述の理由により、前の表と同じになります。













Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.30/0.00 1.05097

2017.01.03 11:34:38 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.05 11:00:00 5 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 11:00:00 6 EURUSD buy stop 0.30/0.30 1.05649

2017.01.05 17:28:37 filled
2017.01.05 11:00:00 7 EURUSD buy limit 0.30/0.00 1.04649

2017.01.05 17:28:37 canceled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 4 0.00 0.00 150.00 3150.00
2017.01.05 11:00:00 4 EURUSD sell in 0.30 1.05149 5 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 5 EURUSD buy out 0.30 1.05649 6 0.00 0.00 -150.00 3000.00

0.00 0.00 0.00 3000.00

次の表は、MetaTrader5、ネットモードでの仮想ストップの使用メソッドを示しています。 ネットモードの仮想ストップは、ヘッジモードと同じように見えるかもしれませんが、内部の仕組みは異なります。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.05 11:00:00 4 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 17:28:37 5 EURUSD buy 0.30/0.30 1.05649

2017.01.05 17:28:37 filled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 3 0.00 0.00 150.00 3150.00
2017.01.05 11:00:00 4 EURUSD sell in 0.30 1.05149 4 0.00 0.00 0.00 3150.00
2017.01.05 17:28:37 5 EURUSD buy out 0.30 1.05649 5 0.00 0.00 -150.00 3000.00

0.00 0.00 0.00 3000.00

例 #2: Heiken を使用した EA と、3つのストップを持つ移動平均

複雑なEAは、多くの場合、複数の ストップロス とテイクプロフィットを必要とします。 追加のストップ、すなわち "stop1" と "stop2" という名前のストップを追加する前の例と同じメソッドを使用します。

int()
  {
//---その他のコード
  
   CStops *stops=new CStops();

   CStop *main=new CStop("main");
   main.StopType(stop_type_main);
   main.VolumeType(VOLUME_TYPE_PERCENT_TOTAL);
   main.Main(true);
   main.StopLoss(stop_loss);
   main.TakeProfit(take_profit);
   stops.Add(GetPointer(main));
   
   CStop *stop1=new CStop("stop1");
   stop1.StopType(stop_type1);
   stop1.VolumeType(VOLUME_TYPE_PERCENT_TOTAL);
   stop1.Volume(0.35);
   stop1.StopLoss(stop_loss1);
   stop1.TakeProfit(take_profit1);
   stops.Add(GetPointer(stop1));
   
   CStop *stop2=new CStop("stop2");
   stop2.StopType(stop_type2);
   stop2.VolumeType(VOLUME_TYPE_PERCENT_TOTAL);
   stop2.Volume(0.35);
   stop2.StopLoss(stop_loss2);
   stop2.TakeProfit(take_profit2);
   stops.Add(GetPointer(stop2));
   
   order_manager.AddStops(GetPointer(stops));

//---その他のコード
  }

次の表は、MetaTrader4のテストの結果を示しています。

# Time Type Order Size Price S / L T / P Profit Balance
1 2017.01.03 10:00 sell 1 0.30 1.04597 1.05097 1.04097
2 2017.01.03 10:00 buy stop 2 0.11 1.04847 0.00000 0.00000
3 2017.01.03 10:00 buy limit 3 0.11 1.04347 0.00000 0.00000
4 2017.01.03 10:21 buy 3 0.11 1.04347 0.00000 0.00000
5 2017.01.03 10:21 close by 1 0.11 1.04347 1.05097 1.04097 27.50 3027.50
6 2017.01.03 10:21 sell 4 0.19 1.04597 1.05097 1.04097
7 2017.01.03 10:21 close by 3 0.00 1.04347 0.00000 0.00000 0.00 3027.50
8 2017.01.03 10:21 delete 2 0.11 1.04847 0.00000 0.00000
9 2017.01.03 10:34 close 4 0.11 1.04247 1.05097 1.04097 38.50 3066.00
10 2017.01.03 10:34 sell 5 0.08 1.04597 1.05097 1.04097
11 2017.01.03 10:00 t/p 5 0.08 1.04097 1.05097 1.04097 40.00 3106.00
12 2017.01.05 11:00 sell 6 0.30 1.05149 1.05649 1.04649
13 2017.01.05 11:00 buy stop 7 0.11 1.05399 0.00000 0.00000
14 2017.01.05 11:00 buy limit 8 0.11 1.04899 0.00000 0.00000
15 2017.01.05 12:58 buy 8 0.11 1.04899 0.00000 0.00000
16 2017.01.05 12:58 close by 6 0.11 1.04899 1.05649 1.04649 27.50 3133.50
17 2017.01.05 12:58 sell 9 0.19 1.05149 1.05649 1.04649
18 2017.01.05 12:58 close by 8 0.00 1.04899 0.00000 0.00000 0.00 3133.50
19 2017.01.05 12:58 delete 7 0.11 1.05399 0.00000 0.00000
20 2017.01.05 16:00 close 9 0.19 1.05314 1.05649 1.04649 -31.35 3102.15
21 2017.01.05 16:00 buy 10 0.30 1.05314 1.04814 1.05814
22 2017.01.05 16:00 sell stop 11 0.11 1.05064 0.00000 0.00000
23 2017.01.05 16:00 sell limit 12 0.11 1.05564 0.00000 0.00000
24 2017.01.05 17:09 sell 12 0.11 1.05564 0.00000 0.00000
25 2017.01.05 17:09 close by 10 0.11 1.05564 1.04814 1.05814 27.50 3129.65
26 2017.01.05 17:09 buy 13 0.19 1.05314 1.04814 1.05814
27 2017.01.05 17:09 close by 12 0.00 1.05564 0.00000 0.00000 0.00 3129.65
28 2017.01.05 17:09 delete 11 0.11 1.05064 0.00000 0.00000
29 2017.01.05 17:28 close 13 0.11 1.05664 1.04814 1.05814 38.50 3168.15
30 2017.01.05 17:28 buy 14 0.08 1.05314 1.04814 1.05814
31 2017.01.05 17:40 t/p 14 0.08 1.05814 1.04814 1.05814 40.00 3208.15


上記の表に示すように、すべての3つのストップは、最初のトレードにトリガされました。 仮想ストップでは、EA は主要トレードの部分的なクローズを予想通りに行いました。 保留中のオーダーを使用するストップでは、保留中のオーダーが実行されるとすぐに、EA は操作によって close を実行し、そのボリュームを主要なトレードから差し引かれます。 最後に、主要なストップは、ブローカーベースのストップは、主なトレードは0.08 ロットの残りのボリュームで決済しています。

次の表は、MetaTrader5、ヘッジモードでのテストの結果を示しています。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597 1.05097 1.04097 2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.11/0.00 1.04847

2017.01.03 10:21:32 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.11/0.11 1.04347

2017.01.03 10:21:32 filled
2017.01.03 10:21:32 5 EURUSD close by 0.11/0.11 1.04347

2017.01.03 10:21:32 filled close #2 by #4
2017.01.03 10:33:40 6 EURUSD buy 0.11/0.11 1.04247

2017.01.03 10:33:40 filled
2017.01.03 11:34:38 7 EURUSD buy 0.08/0.08 1.04097

2017.01.03 11:34:38 filled TP 1.04097
2017.01.05 11:00:00 8 EURUSD sell 0.30/0.30 1.05149 1.05649 1.04649 2017.01.05 11:00:00 filled
2017.01.05 11:00:00 9 EURUSD buy stop 0.11/0.00 1.05399

2017.01.05 12:58:27 canceled
2017.01.05 11:00:00 10 EURUSD buy limit 0.11/0.11 1.04899

2017.01.05 12:58:27 filled
2017.01.05 12:58:27 11 EURUSD close by 0.11/0.11 1.04896

2017.01.05 12:58:27 filled close #8 by #10
2017.01.05 16:00:00 12 EURUSD buy 0.19/0.19 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 13 EURUSD buy 0.30/0.30 1.05307 1.04807 1.05807 2017.01.05 16:00:00 filled
2017.01.05 16:00:00 14 EURUSD sell stop 0.11/0.00 1.05057

2017.01.05 17:09:40 canceled
2017.01.05 16:00:00 15 EURUSD sell limit 0.11/0.11 1.05557

2017.01.05 17:09:40 filled
2017.01.05 17:09:40 16 EURUSD close by 0.11/0.11 1.05557

2017.01.05 17:09:40 filled close #13 by #15
2017.01.05 17:28:47 17 EURUSD sell 0.11/0.11 1.05660

2017.01.05 17:28:47 filled
2017.01.05 17:29:15 18 EURUSD sell 0.08/0.08 1.05807

2017.01.05 17:29:15 filled TP 1.05807

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 10:21:32 3 EURUSD buy in 0.11 1.04347 4 0.00 0.00 0.00 3000.00
2017.01.03 10:21:32 4 EURUSD buy out by 0.11 1.04347 5 0.00 0.00 27.50 3027.50 close #2 by #4
2017.01.03 10:21:32 5 EURUSD sell out by 0.11 1.04597 5 0.00 0.00 0.00 3027.50 close #2 by #4
2017.01.03 10:33:40 6 EURUSD buy out 0.11 1.04247 6 0.00 0.00 38.50 3066.00
2017.01.03 11:34:38 7 EURUSD buy out 0.08 1.04097 7 0.00 0.00 40.00 3106.00 TP 1.04097
2017.01.05 11:00:00 8 EURUSD sell in 0.30 1.05149 8 0.00 0.00 0.00 3106.00
2017.01.05 12:58:27 9 EURUSD buy in 0.11 1.04896 10 0.00 0.00 0.00 3106.00
2017.01.05 12:58:27 10 EURUSD buy out by 0.11 1.04896 11 0.00 0.00 27.83 3133.83 close #8 by #10
2017.01.05 12:58:27 11 EURUSD sell out by 0.11 1.05149 11 0.00 0.00 0.00 3133.83 close #8 by #10
2017.01.05 16:00:00 12 EURUSD buy out 0.19 1.05307 12 0.00 0.00 -30.02 3103.81
2017.01.05 16:00:00 13 EURUSD buy in 0.30 1.05307 13 0.00 0.00 0.00 3103.81
2017.01.05 17:09:40 14 EURUSD sell in 0.11 1.05557 15 0.00 0.00 0.00 3103.81
2017.01.05 17:09:40 16 EURUSD buy out by 0.11 1.05307 16 0.00 0.00 0.00 3103.81 close #13 by #15
2017.01.05 17:09:40 15 EURUSD sell out by 0.11 1.05557 16 0.00 0.00 27.50 3131.31 close #13 by #15
2017.01.05 17:28:47 17 EURUSD sell out 0.11 1.05660 17 0.00 0.00 38.83 3170.14
2017.01.05 17:29:15 18 EURUSD sell out 0.08 1.05807 18 0.00 0.00 40.00 3 210.14 TP 1.05807

0.00 0.00 210.14 3 210.14

上記の表に示されているように、EA は MetaTrader5、ヘッジモードでやや似たようなメソッドで動作します。 このメカニックは、ストップの3種類のMetaTrader4と同じでした。

次の表は、MetaTrader5、ネットモードでのテストの結果を示しています。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.30/0.00 1.05097

2017.01.03 11:34:38 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.30/0.30 1.04097

2017.01.03 11:34:38 filled
2017.01.03 10:00:00 5 EURUSD buy stop 0.11/0.00 1.04847

2017.01.03 10:21:32 canceled
2017.01.03 10:00:00 6 EURUSD buy limit 0.11/0.11 1.04347

2017.01.03 10:21:32 filled
2017.01.03 10:33:40 7 EURUSD buy 0.11/0.11 1.04247

2017.01.03 10:33:40 filled
2017.01.05 11:00:00 8 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 11:00:00 9 EURUSD buy stop 0.30/0.00 1.05649

2017.01.05 16:00:00 canceled
2017.01.05 11:00:00 10 EURUSD buy limit 0.30/0.00 1.04649

2017.01.05 16:00:00 canceled
2017.01.05 11:00:00 11 EURUSD buy stop 0.11/0.00 1.05399

2017.01.05 12:58:27 canceled
2017.01.05 11:00:00 12 EURUSD buy limit 0.11/0.11 1.04899

2017.01.05 12:58:27 filled
2017.01.05 16:00:00 13 EURUSD buy 0.19/0.19 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 14 EURUSD buy 0.30/0.30 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 15 EURUSD sell stop 0.30/0.00 1.04807

2017.01.05 17:29:15 canceled
2017.01.05 16:00:00 16 EURUSD sell limit 0.30/0.30 1.05807

2017.01.05 17:29:15 filled
2017.01.05 16:00:00 17 EURUSD sell stop 0.11/0.00 1.05057

2017.01.05 17:09:40 canceled
2017.01.05 16:00:00 18 EURUSD sell limit 0.11/0.11 1.05557

2017.01.05 17:09:40 filled
2017.01.05 17:28:47 19 EURUSD sell 0.11/0.11 1.05660

2017.01.05 17:28:47 filled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 5 EURUSD buy in/out 0.30 1.04097 4 0.00 0.00 40.00 3040.00
2017.01.03 10:21:32 3 EURUSD buy out 0.11 1.04347 6 0.00 0.00 27.50 3067.50
2017.01.03 10:33:40 4 EURUSD buy out 0.11 1.04247 7 0.00 0.00 38.50 3106.00
2017.01.05 11:00:00 6 EURUSD sell in/out 0.30 1.05149 8 0.00 -0.61 231.44 3336.83
2017.01.05 12:58:27 7 EURUSD buy in/out 0.11 1.04896 12 0.00 0.00 20.24 3357.07
2017.01.05 16:00:00 8 EURUSD buy in 0.19 1.05307 13 0.00 0.00 0.00 3357.07
2017.01.05 16:00:00 9 EURUSD buy in 0.30 1.05307 14 0.00 0.00 0.00 3357.07
2017.01.05 17:29:15 12 EURUSD sell out 0.30 1.05807 16 0.00 0.00 157.11 3514.18
2017.01.05 17:09:40 10 EURUSD sell out 0.11 1.05557 18 0.00 0.00 30.11 3544.29
2017.01.05 17:28:47 11 EURUSD sell out 0.11 1.05660 19 0.00 0.00 41.44 3585.73

0.00 -0.61 586.34 3585.73

ここでは、問題が発生しました。 最後のストップは、前の2つのテストで観測された0.08 ロットではなく0.30 ロットで決済しました。

前に説明したように、MetaTrader5の標準 ストップロス とテイクプロフィットは、ネットモードでは、前の2つのものとは異なります。 したがって、EA はブローカーベースのストップを、代わりに保留中のオーダーベースのストップに変換します。 ただし、この設定では、EA はすでに保留中のオーダーに基づいて2つのストップを持っており、そのうちの1つがメインストップです。 また、前述のように、孤立したトレードにつながる。 最終または主要なストップは、常に主要なトレードの最初のボリュームに等しいボリュームを持つことになります。 また、他のストップが関与していたので、メインのストップには、残りのボリューム以上のメインのポジションを閉じるにつながることができます。

この問題を解決するために、1つのメソッドは、メインのストップを仮想ではなく、ブローカーベースまたは保留中の順序に基づいて設定することです。 この新しい設定では、EA は現在、仮想であり、保留中のオーダーに基づいている1つのストップを2ストップしています。 この新しい設定を使用したテストの結果を以下に示します。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597

2017.01.03 10:00:00 filled
2017.01.03 10:00:00 3 EURUSD buy stop 0.11/0.00 1.04847

2017.01.03 10:21:32 canceled
2017.01.03 10:00:00 4 EURUSD buy limit 0.11/0.11 1.04347

2017.01.03 10:21:32 filled
2017.01.03 10:33:40 5 EURUSD buy 0.11/0.11 1.04247

2017.01.03 10:33:40 filled
2017.01.03 11:34:38 6 EURUSD buy 0.08/0.08 1.04097

2017.01.03 11:34:38 filled
2017.01.05 11:00:00 7 EURUSD sell 0.30/0.30 1.05149

2017.01.05 11:00:00 filled
2017.01.05 11:00:00 8 EURUSD buy stop 0.11/0.00 1.05399

2017.01.05 12:58:27 canceled
2017.01.05 11:00:00 9 EURUSD buy limit 0.11/0.11 1.04899

2017.01.05 12:58:27 filled
2017.01.05 16:00:00 10 EURUSD buy 0.19/0.19 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 11 EURUSD buy 0.30/0.30 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 12 EURUSD sell stop 0.11/0.00 1.05057

2017.01.05 17:09:40 canceled
2017.01.05 16:00:00 13 EURUSD sell limit 0.11/0.11 1.05557

2017.01.05 17:09:40 filled
2017.01.05 17:28:47 14 EURUSD sell 0.11/0.11 1.05660

2017.01.05 17:28:47 filled
2017.01.05 17:29:15 15 EURUSD sell 0.08/0.08 1.05807

2017.01.05 17:29:15 filled

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 10:21:32 3 EURUSD buy out 0.11 1.04347 4 0.00 0.00 27.50 3027.50
2017.01.03 10:33:40 4 EURUSD buy out 0.11 1.04247 5 0.00 0.00 38.50 3066.00
2017.01.03 11:34:38 5 EURUSD buy out 0.08 1.04097 6 0.00 0.00 40.00 3106.00
2017.01.05 11:00:00 6 EURUSD sell in 0.30 1.05149 7 0.00 0.00 0.00 3106.00
2017.01.05 12:58:27 7 EURUSD buy out 0.11 1.04896 9 0.00 0.00 27.83 3133.83
2017.01.05 16:00:00 8 EURUSD buy out 0.19 1.05307 10 0.00 0.00 -30.02 3103.81
2017.01.05 16:00:00 9 EURUSD buy in 0.30 1.05307 11 0.00 0.00 0.00 3103.81
2017.01.05 17:09:40 10 EURUSD sell out 0.11 1.05557 13 0.00 0.00 27.50 3131.31
2017.01.05 17:28:47 11 EURUSD sell out 0.11 1.05660 14 0.00 0.00 38.83 3170.14
2017.01.05 17:29:15 12 EURUSD sell out 0.08 1.05807 15 0.00 0.00 40.00 3 210.14

0.00 0.00 210.14 3 210.14

ストップによって取られる総ボリュームは主要なトレードの最初のボリュームと同じです。

例 #3: 資金管理とストップ

以前の記事 (「クロスプラットフォームEA: マネーマネジメント」を参照) では、一部の資金管理メソッドが一定のストップに依存していることが議論されました (テイクプロフィットは可能ですが、ストップロス は通常使用されます)。 固定小数、固定リスク、ポイント/pip あたりの固定リスクなどの資金管理メソッドは、しばしば有限の ストップロス レベルを必要とします。 このレベルを設定しないと、非常に大きい、あるいは無限のリスクが示唆され、したがって、計算されたボリュームも非常に大きくなります。 この記事に記載されているクラスオブジェクトを 資金管理できるEAを表示するために、最初の例を変更して、以前にコメントしたコード行がコンパイルに含まれるようにします。

まず、以下のコードに示されているように、資金管理メソッドのコード行にコメントタグを削除します。:

int()
  {
//---その他のコード
   order_manager=new COrderManager();
   money_manager= new CMoneys();
   CMoney *money_fixed=new CMoneyFixedLot(0.05);
   CMoney *money_ff=new 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);
//---その他のコード
  }

次に、ソースコードの先頭で、カスタム列挙体を宣言して、使用する 資金管理メソッドをソースコードで提示された順序で選択できるようにする外部パラメータを作成します。

enum ENUM_MM_TYPE
  {
   MM_FIXED=0,
   MM_FIXED_FRACTIONAL,
   MM_FIXED_RATIO,
   MM_FIXED_RISK_PER_POINT,
   MM_FIXED_RISK
  };

次に、この列挙体の新しいインプットパラメータを宣言します。

input ENUM_MM_TYPE mm_type=MM_FIXED_FRACTIONAL;

最後に、OnTick 関数内の資金の管理メソッドの実際の選択にこのパラメータをリンクする必要があります:

void OnTick()
  {
//---   
   manage_trades();
   if(symbol_info.RefreshRates())
     {
      signals.Check();
      if(signals.CheckOpenLong())
        {
         close_last();
         if(time_filters.Evaluate(TimeCurrent()))
           {
            Print("Entering buy trade..");
            money_manager.Selected((int)mm_type); //use mm_type, cast to 'int' type
            order_manager.TradeOpen(Symbol(),ORDER_TYPE_BUY,symbol_info.Ask());
           }
        }
      else if(signals.CheckOpenShort())
        {
         close_last();
         if(time_filters.Evaluate(TimeCurrent()))
           {
            Print("Entering sell trade..");
            money_manager.Selected((int)mm_type); //use mm_type, cast to 'int' type
            order_manager.TradeOpen(Symbol(),ORDER_TYPE_SELL,symbol_info.Bid());
           }
        }
     }
  }

資金管理メソッドは純粋な計算だけで対処するので、MQL4 と MQL5 の間の互換性に関する問題はありません。 前の2つの例では、2つのプラットフォームでストップがどのように動作するかを既に示しています。 次の表は、MetaTrader5 のヘッジモードに関するテストの結果を示しています。

固定小数金管理を使用したテスト結果を示しています。 コード化された設定は、アカウントの 5% のリスクです。 $3000 の開始のバランスによって、最初のトレードの ストップロス に当るかどうか $150 あたりをを期待します。 ストップロス とテイクプロフィットは同じ値 (500 ポイント) なので、テイクプロフィットになる場合、同様に $150 を期待しています。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.30/0.30 1.04597 1.05097 1.04097 2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.30/0.30 1.04097

2017.01.03 11:34:38 filled TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell 0.32 / 0.32 1.05149 1.05649 1.04649 2017.01.05 11:00:00 filled
2017.01.05 16:00:00 5 EURUSD buy 0.32 / 0.32 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 6 EURUSD buy 0.31 / 0.31 1.05307 1.04807 1.05807 2017.01.05 16:00:00 filled
2017.01.05 17:29:15 7 EURUSD sell 0.31 / 0.31 1.05807

2017.01.05 17:29:15 filled TP 1.05807

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.30 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.30 1.04097 3 0.00 0.00 150.00 3150.00 TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell in 0.32 1.05149 4 0.00 0.00 0.00 3150.00
2017.01.05 16:00:00 5 EURUSD buy out 0.32 1.05307 5 0.00 0.00 -50.56 3 099.44
2017.01.05 16:00:00 6 EURUSD buy in 0.31 1.05307 6 0.00 0.00 0.00 3 099.44
2017.01.05 17:29:15 7 EURUSD sell out 0.31 1.05807 7 0.00 0.00 155.00 3 254.44 TP 1.05807

0.00 0.00 254.44 3 254.44

計算されたボリューム値は、最小ロットおよび最小ロットステップパラメータによって決まるブローカーのロット精度にも依存することに注意してください。 EAに常に正確な計算を行うことを期待することはできません これらの制約により、EAは、ある時点で値を四捨五入する必要があります。 同じことは、金銭管理の他のメソッドについても同様です。

資金管理ごとの固定リスクの場合、コード化された設定は、ストップロス のポイントごとに $0.1 のリスクになります。 両方の ストップロス とテイクプロフィットの500ポイントの設定では、利益/損失 $50 のいずれかを期待しています。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.10 / 0.10 1.04597 1.05097 1.04097 2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.10 / 0.10 1.04097

2017.01.03 11:34:38 filled TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell 0.10 / 0.10 1.05149 1.05649 1.04649 2017.01.05 11:00:00 filled
2017.01.05 16:00:00 5 EURUSD buy 0.10 / 0.10 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 6 EURUSD buy 0.10 / 0.10 1.05307 1.04807 1.05807 2017.01.05 16:00:00 filled
2017.01.05 17:29:15 7 EURUSD sell 0.10 / 0.10 1.05807

2017.01.05 17:29:15 filled TP 1.05807

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.10 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.10 1.04097 3 0.00 0.00 50.00 3 050.00 TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell in 0.10 1.05149 4 0.00 0.00 0.00 3 050.00
2017.01.05 16:00:00 5 EURUSD buy out 0.10 1.05307 5 0.00 0.00 -15.80 3 034.20
2017.01.05 16:00:00 6 EURUSD buy in 0.10 1.05307 6 0.00 0.00 0.00 3 034.20
2017.01.05 17:29:15 7 EURUSD sell out 0.10 1.05807 7 0.00 0.00 50.00 3 084.20 TP 1.05807

0.00 0.00 84.20 3 084.20

固定リスク資金管理の場合、コード化された設定は $100 のリスクになります。 このEA は、このセットのリスクに適合するボリュームを計算する必要があります。 結果は以下の通りです。














Orders
Open Time Order Symbol Type Volume Price S / L T / P Time State Comment
2017.01.03 10:00:00 2 EURUSD sell 0.20 / 0.20 1.04597 1.05097 1.04097 2017.01.03 10:00:00 filled
2017.01.03 11:34:38 3 EURUSD buy 0.20 / 0.20 1.04097

2017.01.03 11:34:38 filled TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell 0.20 / 0.20 1.05149 1.05649 1.04649 2017.01.05 11:00:00 filled
2017.01.05 16:00:00 5 EURUSD buy 0.20 / 0.20 1.05307

2017.01.05 16:00:00 filled
2017.01.05 16:00:00 6 EURUSD buy 0.20 / 0.20 1.05307 1.04807 1.05807 2017.01.05 16:00:00 filled
2017.01.05 17:29:15 7 EURUSD sell 0.20 / 0.20 1.05807

2017.01.05 17:29:15 filled TP 1.05807

Deals
Time Deal Symbol Type Direction Volume Price Order Commission Swap Profit Balance Comment
2017.01.01 00:00:00 1
balance



0.00 0.00 3000.00 3000.00
2017.01.03 10:00:00 2 EURUSD sell in 0.20 1.04597 2 0.00 0.00 0.00 3000.00
2017.01.03 11:34:38 3 EURUSD buy out 0.20 1.04097 3 0.00 0.00 100.00 3 100.00 TP 1.04097
2017.01.05 11:00:00 4 EURUSD sell in 0.20 1.05149 4 0.00 0.00 0.00 3 100.00
2017.01.05 16:00:00 5 EURUSD buy out 0.20 1.05307 5 0.00 0.00 -31.60 3 068.40
2017.01.05 16:00:00 6 EURUSD buy in 0.20 1.05307 6 0.00 0.00 0.00 3 068.40
2017.01.05 17:29:15 7 EURUSD sell out 0.20 1.05807 7 0.00 0.00 100.00 3 168.40 TP 1.05807

0.00 0.00 168.40 3 168.40

オーダーマネージャは、常に資金の管理に使用するものであることを検討することを忘れないでください。 メインストップが宣言されていない場合、他のストップが存在する場合でも、ストップロス ベースの 資金管理メソッドは使用できません。

結論

この記事では、クロスプラットフォームEAにおけるストップの追加について説明しました。 2つのトレーディングプラットフォームは、多くのパラレル関数を備えていますが、ストップの実装メソッドは大きく異なります。 この記事には、EAが両方のプラットフォームと互換性を持つために、違いを調整できるメソッドが用意されています。

この記事で使用されるプログラム

#
Name
Type
Description
1.
stops_ha_ma1.mqh
Header File
最初の例のEAに使用されるメインヘッダーファイル
2.
stops_ha_ma1.mq4 Expert Advisor
最初の例の MQL4 EAに使用されるメインソースファイル
3.
stops_ha_ma1.mq5 Expert Advisor 最初の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル
4.  stops_ha_ma2.mqh Header File 2番目の例のEAに使用されるメインヘッダーファイル
5.  stops_ha_ma2.mq4 Expert Advisor
2番目の例の MQL4 EAに使用されるメインソースファイル
6.  stops_ha_ma2.mq5 Expert Advisor
2番目の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル
7.  stops_ha_ma3.mqh Header File 3番目の例のEAに使用されるメインヘッダーファイル
8.  stops_ha_ma3.mq4 Expert Advisor
3番目の例の MQL4 EAに使用されるメインソースファイル
9.  stops_ha_ma3.mq5 Expert Advisor
3番目の例の MQL5 エキスパートアドバイザで使用されるメインソースファイル

この記事で紹介されているクラスファイル

#
Name
Type
Description
1.
MQLx\Base\Stop\StopBase.mqh
Header File
CStop (base class)
2.
MQLx\MQL4\Stop\Stop.mqh Header File CStop (MQL4 version)
3.
MQLx\MQL5\Stop\Stop.mqh Header File CStop (MQL5 version)
4. MQLx\Base\Stop\StopsBase.mqh Header File CStops (CStop container, base class)
5. MQLx\MQL4\Stop\Stops.mqh Header File CStops (MQL4 version)
6. MQLx\MQL5\Stop\Stops.mqh Header File CStops (MQL5 version)
7. MQLx\Base\Stop\StopLineBase.mqh Header File CStopLine (graphical representation, base class)
8. MQLx\MQL4\Stop\StopLine.mqh Header File CStopLine (MQL4 version)
9. MQLx\MQL5\Stop\StopLine.mqh Header File CStopLine (MQL5 version)
10.  MQLx\Base\Order\OrderStopBase.mqh Header File COrderStop (base class)
11.  MQLx\MQL4\Order\OrderStop.mqh Header File COrderStop (MQL4 version)
12.  MQLx\MQL5\Order\OrderStop.mqh Header File COrderStop (MQL5 version)
13.
 MQLx\Base\Order\OrderStopVirtualBase.mqh Header File
COrderStopVirtual (virtual stop level, base class)
14.  MQLx\Base\Order\OrderStopVirtual.mqh Header File
COrderStopVirtual (MQL4 version)
15.
 MQLx\Base\Order\OrderStopVirtual.mqh Header File
COrderStopVirtual (MQL5 version)
16.  MQLx\Base\Order\OrderStopPendingBase.mqh Header File
COrderStopPending (pending order stop level, base class)
17.  MQLx\Base\Order\OrderStopPending.mqh Header File
COrderStopPending (MQL4 version)
18.
 MQLx\Base\Order\OrderStopPending.mqh Header File
COrderStopPending (MQL5 version)
19.
 MQLx\Base\Order\OrderStopBroker.mqh Header File
COrderStopBroker (broker-based stop level, base class)
20.  MQLx\Base\Order\OrderStopBroker.mqh Header File
COrderStopBroker (MQL4 version)
21.  MQLx\Base\Order\OrderStopBroker.mqh Header File
COrderStopBroker (MQL5 version)
22.  MQLx\Base\Order\OrderStopsBase.mqh Header File
COrderStops (COrderStop container, base class)
23.  MQLx\Base\Order\OrderStops.mqh Header File
COrderStops (MQL4 version)
24.  MQLx\Base\Order\OrderStops.mqh Header File
COrderStops (MQL5 version)

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/3620

添付されたファイル |
tester.zip (1445.59 KB)
MQL5.zip (708.29 KB)
トレードオブジェクト: メタトレーダーのグラフィカルオブジェクトに基づいたトレードの自動化 トレードオブジェクト: メタトレーダーのグラフィカルオブジェクトに基づいたトレードの自動化
この記事では、チャートのリニアマークアップに基づいて自動トレーディングシステムを作成するための簡単なアプローチを扱います。MetaTrader4 およびMetaTrader5のオブジェクトの標準プロパティを使用して既製EAを提供し、トレードオペレーションをサポートしています。
ディープニューラルネットワーク(その3)サンプル選択と次元削減 ディープニューラルネットワーク(その3)サンプル選択と次元削減
本稿は、ディープニューラルネットワークに関する一連の記事の続きです。ここでは、ニューラルネットワークの訓練データの準備に当たってのサンプルの選択(ノイズ除去)、入力データの次元数の削減、及びデータセットの訓練/検証/テストセットへの分割を検討します。
一連の取引に対するリスク評価 一連の取引に対するリスク評価
この記事では、トレードシステムの分析における確率と数学的統計理論のメソッドについて説明します。
グラフィカルインターフェイスXI:テーブルセル内のテキストエディットボックスとコンボボックス(ビルド15) グラフィカルインターフェイスXI:テーブルセル内のテキストエディットボックスとコンボボックス(ビルド15)
このライブラリアップデートでは、テーブルコントロール(CTableクラス)に新しいオプションが追加されます。テーブルセル内のコントロールのラインアップが拡張され、今回はテキストエディットボックスとコンボボックスが追加されます。また、このアップデートでは、実行中にMQLアプリケーションのウィンドウのイズを変更する機能も導入されています。